#include <iostream>

using namespace std;
//默认情况下，c++编译器至少给一个类添加3个函数
//1.默认构造函数(无参，函数体为空)
//2.默认析构函数(无参，函数体为空)
//3.默认拷贝构造函数，对属性进行值拷贝

//构造函数调用规则如下:
//如果用户定义有参构造函数，C++不在提供默认无参构造，但是会提供默认拷贝构造
//如果用户定义拷贝构造函数，C++不会再提供其他构造函数
class Person {
public:
    int age;

    Person() {//无参构造
        cout << "默认构造函数的调用!" << endl;
    }

    Person(int age) {//有参构造
        this->age = age;
        cout << "有参构造函数的调用!" << endl;
    }

    Person(const Person &person) {//拷贝构造
        this->age = person.age;
        cout << "拷贝构造函数的调用!" << endl;
    }

    ~Person() {//析构函数
        cout << "析构函数的调用!" << endl;
    }
};

//如果用户定义有参构造函数，C++不在提供默认无参构造，但是会提供默认拷贝构造
void test1() {
    Person person1;
    person1.age = 18;
    Person person2(person1);
    cout << "person2:age=" << person2.age << endl;
    cout << "=========" << endl;
}

//如果用户定义拷贝构造函数，c++不会再提供其他构造函数
void test2() {
    Person person1(19);
    Person person2(person1);
    cout << "person2:age=" << person2.age << endl;
    cout << "=========" << endl;
}

int main() {
    test1();
    test2();
    return 0;
}

